package com.it.od.old2021.deke1;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Author: Amos
 * E-mail: amos@amoscloud.com
 * Date: 2021/4/1
 * Time: 17:00
 * Description: 64%  整数编码
 */
public class Main43 {
    /*
       实现一个整数编码方法
       使得待编码的数字越小
       编码后所占用的字节数越小
       编码规则如下
       1.编码时7位一组，每个字节的低7位用于存储待编码数字的补码
       2.字节的最高位表示后续是否还有字节，置1表示后面还有更多的字节，
       置0表示当前字节为最后一个字节
       3.采用小端序编码，低位和低字节放在低地址上
       4.编码结果按16进制数的字符格式进行输出，小写字母需要转化为大写字母

       输入描述
       输入的为一个字符串表示的非负整数
       输出描述
       输出一个字符串表示整数编码的16进制码流

       示例一
       输入
       0
       输出
       00
       说明：输出的16进制字符不足两位的前面补零

       示例二
       输入
       100
       输出
       64
       说明:100的二进制表示为0110 0100只需一个字节进行编码
       字节的最高位0，剩余7位存储数字100的低7位(1100100)所以编码后的输出为64

       示例三
       输入
       1000
       输出
       E807
       说明
       1000的二进制表示为 0011 1110 1000 至少需要两个字节进行编码
       第一个字节最高位是1 剩余7位存储数字 1000的低7位(1101000)
       所以第一个字节的二进制位(1110 1000)即E8
       第二个字节最高位置0 剩余的7位存储数字 1000的第二个低7位(0000111)
       所以第一个字节的二进制为(0000 0111)即07
       采用小端序编码 所以低字节E8输出在前面
       高字节07输出在后面

       备注
           代编码数字取值范围为 [0,1<<64-1]
        */
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int num = Integer.parseInt(in.nextLine());
        in.close();

        String bin = Integer.toBinaryString(num);
        int len = bin.length();
        int mod = len % 7;
        int m = mod == 0 ? len / 7 : len / 7 + 1;
        StringBuffer sb = new StringBuffer();
        int pos = len;
        if (m == 1) {
            // 前面无需补数，也可以补0
        } else {
            while (m > 0) {
                if (pos - 7 >= 0) {
                    String tmp = bin.substring(pos - 7, pos);
                    if (tmp.startsWith("0")) {
                        sb.append(Integer.toHexString(Integer.parseInt("0" + bin.substring(pos - 7, pos), 2)));
                    } else {
                        sb.append(Integer.toHexString(Integer.parseInt("1" + bin.substring(pos - 7, pos), 2)));
                    }
                    pos = pos - 7;
                }
                m--;
            }
        }

        // 111 1101000
        if (pos > 0) {
            String hex = Integer.toHexString(Integer.parseInt(bin.substring(0, pos), 2));
            sb.append(String.format("%02d", Integer.valueOf(hex)));
        }

        System.out.println(sb.toString().toUpperCase());
    }

    private static void m1(int num) {
        String binary = Integer.toBinaryString(num);
        int len = binary.length();

        StringBuilder sb = new StringBuilder();
        for (int i = len; i > 0; i -= 7) {
            int start = Math.max(i - 7, 0);

            String bin = binary.substring(start, i);

            if (bin.length() < 7) {
                StringBuilder head = new StringBuilder();
                for (int j = 0; j < 7 - bin.length(); j++) {
                    head.append("0");
                }
                bin = head.append(bin).toString();
            }
            bin = i - 7 <= 0 ? "0" + bin : "1" + bin;
            String hex = Integer.toHexString(Integer.parseInt(bin, 2)).toUpperCase();
            if (hex.length() == 1) {
                hex = "0" + hex;
            }
            sb.append(hex);
        }

        System.out.println(sb);
    }
}
